/**
 * Author: luoqi
 * Created Date: 2025-11-11 23:24:47
 * Last Modified: 2025-11-15 03:25:37
 * Modified By: luoqi at <**@****>
 * Copyright (c) 2025 <*****>
 * Description:
 */

#include <gpio.h>
#include "io_port.h"

int io_set(GPOPort io, IOState state)
{
    GPIO_TypeDef *port;
    uint16_t pin;
    switch(io) {
    case GPO_BLINK: 
        port = BLINK_GPIO_Port;
        pin = BLINK_Pin;
        break;
    case GPO_DRV_ENA: 
        port = DRV_ENA_GPIO_Port;
        pin = DRV_ENA_Pin;
        break;
    case GPO_A15: 
        port = GPO_A15_GPIO_Port;
        pin = GPO_A15_Pin;
        break;
    default:
        return -1;
    }
    if(state == IO_HIGH) {
        HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET);
    } else {
        HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET);
    }
    return 0;
}

int io_toggle(GPOPort io)
{
    GPIO_TypeDef *port;
    uint16_t pin;
    switch(io) {
    case GPO_BLINK: 
        port = BLINK_GPIO_Port;
        pin = BLINK_Pin;
        break;
    case GPO_DRV_ENA: 
        port = DRV_ENA_GPIO_Port;
        pin = DRV_ENA_Pin;
        break;
    case GPO_A15: 
        port = GPO_A15_GPIO_Port;
        pin = GPO_A15_Pin;
        break;
    default:
        return -1;
    }
    HAL_GPIO_TogglePin(port, pin);
    return 0;
}

IOState io_get(GPIPort io)
{
    GPIO_TypeDef *port;
    uint16_t pin;
    switch(io) {
    case GPI_B8: 
        port = GPI_B8_GPIO_Port;
        pin = GPI_B8_Pin;
        break;
    case GPI_B9: 
        port = GPI_B9_GPIO_Port;
        pin = GPI_B9_Pin;
        break;
    default:
        return -1;
    }

    GPIO_PinState state = HAL_GPIO_ReadPin(port, pin);
    if(state == GPIO_PIN_SET) {
        return IO_HIGH;
    } else {
        return IO_LOW;
    }
}
#include <bsp.h>
__weak void io_encz2_exti_override(void)
{
    // kprintf("ENCZ2_Pin EXTI\r\n");
}

__weak void io_encz3_exti_override(void)
{
    // kprintf("ENCZ3_Pin EXTI\r\n");
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == ENC2_Z_Pin) {
        io_encz2_exti_override();
    } else if(GPIO_Pin == ENC3_Z_Pin) {
        io_encz3_exti_override();
    }
}
